home *** CD-ROM | disk | FTP | other *** search
/ Java Developer's Companion / Java Developer's Companion.iso / Javacup / PR8ADPL7.TAR / productivity_tools / PR8ADPL7 / TextEditComponent.java < prev    next >
Encoding:
Java Source  |  1996-05-23  |  8.6 KB  |  332 lines

  1. // TextEditComponent.java
  2. // An AWT component for doing editing of simple text files, loaded via JFS
  3. import java.awt.*;
  4. import java.io.IOException;
  5.  
  6. public class TextEditComponent extends JFScomponent
  7. {
  8.     String text;
  9.     Button loadb, saveb, newb, insertb, printb;
  10.     Button searchb, replaceb, cutb, copyb, pasteb, writeb;
  11.     Panel top, bot;
  12.     TextArea editor;
  13.     FileReq loadreq, savereq, insertreq, writereq;
  14.     String writesel;    // selection upon write
  15.  
  16.     String mtype[] = {"text/plain", "text/html", "text/sgml"};
  17.  
  18.     void init(java.applet.Applet a)
  19.     {
  20.     Color hi = new Color(220, 220, 220);
  21.     Color lo = new Color(50, 50, 50);
  22.     setLayout(new BorderLayout());
  23.  
  24.     // Create top buttons
  25.     top = new Panel();
  26.     top.setLayout(new GridLayout(1,4));
  27.     top.add(loadb = new Button("Load"));
  28.     top.add(saveb = new Button("Save"));
  29.     top.add(insertb = new Button("Insert"));
  30.     top.add(newb = new Button("New"));
  31.     top.add(printb = new Button("Print"));
  32.     add("North",top);
  33.     top.disable();
  34.  
  35.     // Create text field
  36.     editor = new TextArea();
  37.     editor.setFont(new Font("courier", Font.PLAIN, 12));
  38.     add("Center",editor);
  39.     editor.disable();
  40.  
  41.     // Create bottom buttons
  42.     bot = new Panel();
  43.     bot.setLayout(new GridLayout(1,0));
  44.     bot.add(searchb = new Button("Search"));
  45.     bot.add(replaceb = new Button("Replace"));
  46.     bot.add(cutb = new Button("Cut"));
  47.     bot.add(copyb = new Button("Copy"));
  48.     bot.add(pasteb = new Button("Paste"));
  49.     bot.add(writeb = new Button("Write"));
  50.     add("South",bot);
  51.     bot.disable();
  52.     }
  53.  
  54.     // connect
  55.     // Use this client for loading and saving
  56.     void connect(JFSclient c)
  57.     {
  58.     super.connect(c);
  59.     if (editor != null) {
  60.         top.enable();
  61.         bot.enable();
  62.         editor.enable();
  63.         }
  64.     try if (!client.canaccess("/dev/Printer", 'w')) printb.disable();
  65.     catch(RequestException e);
  66.     }
  67.  
  68.     // load
  69.     // Load the named text file and version
  70.     void load(String file, int ver) throws RequestException
  71.     {
  72.     byte fd[] = client.get(file, ver);
  73.     if (editor != null) editor.setText(new String(fd,0));
  74.     else text = new String(fd,0);
  75.     client.setcurrent(file, client.statfile(file).type);
  76.     }
  77.  
  78.     // insert
  79.     // Insert the named text file into the buffer at the current selection
  80.     void insert(String file, int ver) throws RequestException
  81.     {
  82.     byte fd[] = client.get(file, ver);
  83.     editor.replaceText(new String(fd,0),
  84.                editor.getSelectionStart(),
  85.                editor.getSelectionEnd());
  86.     }
  87.  
  88.     // wantedsize
  89.     // How big this component would like to be.
  90.     Dimension wantedsize()
  91.     {
  92.     return new Dimension(600,400);
  93.     }
  94.  
  95.     // print
  96.     // Print the current file to the given printer
  97.     void print(String printer, String type) throws RequestException
  98.     {
  99.     if (!type.equals("Text"))
  100.         throw new RequestException("Only Text printers are supported");
  101.     String edittxt;
  102.     if (editor != null) edittxt = editor.getText();
  103.     else edittxt = text;
  104.     byte fd[] = new byte[edittxt.length()];
  105.     edittxt.getBytes(0, edittxt.length(), fd, 0);
  106.     Message head = new Message();
  107.     head.add("Printer", printer);
  108.     try client.devput("/dev/Printer", fd, head);
  109.     catch(RequestException e)
  110.         throw new RequestException("Error writing to printer : "+
  111.                        e.getMessage());
  112.     }
  113.  
  114.     // action
  115.     // Called when a user activates some user interface component
  116.     public boolean action(Event evt, Object obj)
  117.     {
  118.     if (evt.target == loadb && loadreq == null) {
  119.         loadreq = new FileReq(client, this, "Load", "text/*",
  120.                       false, null);
  121.         }
  122.     else if (evt.target == saveb && savereq == null) {
  123.         savereq = new FileReq(client, this, "Save", "text/*",
  124.                       true, mtype);
  125.         }
  126.     else if (evt.target == newb) {
  127.         // clear editor window
  128.         editor.setText("");
  129.         }
  130.     else if (evt.target == insertb) {
  131.         // open insert requestor
  132.         insertreq = new FileReq(client, this, "Insert", "text/*",
  133.                     false, mtype);
  134.         }
  135.     else if (evt.target == printb) {
  136.         // open print requestor
  137.         new PrintRequestor(this, client);
  138.         }
  139.     else if (evt.target == searchb) {
  140.         // Open search requestor
  141.         new SARrequestor(this, false);
  142.         }
  143.     else if (evt.target == replaceb) {
  144.         // Open replace requestor
  145.         new SARrequestor(this, true);
  146.         }
  147.     else if (evt.target == cutb) {
  148.         // Cut selected text
  149.         client.setbuf(editor.getSelectedText());
  150.         editor.replaceText("",editor.getSelectionStart(),
  151.                       editor.getSelectionEnd());
  152.         }
  153.     else if (evt.target == copyb) {
  154.         // Copy selected text
  155.         client.setbuf(editor.getSelectedText());
  156.         }
  157.     else if (evt.target == pasteb) {
  158.         // Paste text from cut buffer
  159.         if (client.getbuf() instanceof String)
  160.             editor.replaceText((String)client.getbuf(),
  161.                        editor.getSelectionStart(),
  162.                        editor.getSelectionEnd());
  163.         }
  164.     else if (evt.target == writeb) {
  165.         // Save selected text
  166.         writesel = editor.getSelectedText();
  167.         writereq = new FileReq(client, this, "Write", "text/*",
  168.                        true, mtype);
  169.         }
  170.  
  171.     else if (evt.target == loadreq) {
  172.         if (((String)evt.arg).equals("Load")) {
  173.             // load a file
  174.             try load(loadreq.getfile(), loadreq.getversion());
  175.             catch(RequestException e)
  176.                 new ErrorWindow("Could not open "+
  177.                         loadreq.getfile()+" : "+
  178.                         e.getMessage());
  179.             }
  180.         loadreq = null;
  181.         }
  182.     else if (evt.target == savereq) {
  183.         if (((String)evt.arg).equals("Save")) {
  184.             // save the current file
  185.             String text = editor.getText();
  186.             byte fd[] = new byte[text.length()];
  187.             text.getBytes(0, text.length(), fd, 0);
  188.             try save(fd, savereq.getfile(),
  189.                  savereq.gettype(), savereq.getversion(),
  190.                  savereq.multiversion());
  191.             catch(RequestException e)
  192.                 new ErrorWindow("Could not save "+
  193.                         savereq.getfile()+" : "+
  194.                         e.getMessage());
  195.             }
  196.         savereq = null;
  197.         }
  198.     else if (evt.target == insertreq) {
  199.         if (((String)evt.arg).equals("Insert")) {
  200.             // insert a file
  201.             try insert(insertreq.getfile(), insertreq.getversion());
  202.             catch(RequestException e)
  203.                 new ErrorWindow("Could not open "+
  204.                         insertreq.getfile()+" : "+
  205.                         e.getMessage());
  206.             }
  207.         insertreq = null;
  208.         }
  209.     else if (evt.target == writereq) {
  210.         if (((String)evt.arg).equals("Write")) {
  211.             // Write out the text that was selected when
  212.             // 'write' was clicked
  213.             byte fd[] = new byte[writesel.length()];
  214.             writesel.getBytes(0, writesel.length(), fd, 0);
  215.             try save(fd, writereq.getfile(),
  216.                  writereq.gettype(), writereq.getversion(),
  217.                  writereq.multiversion());
  218.             catch(RequestException e)
  219.                 new ErrorWindow("Could not write "+
  220.                         writereq.getfile()+" : "+
  221.                         e.getMessage());
  222.             }
  223.         writereq = null;
  224.         }
  225.     return true;
  226.     }
  227. }
  228.  
  229. // SARrequestor
  230. // A window for doing searches and possibly replaces.
  231. class SARrequestor extends Frame
  232. {
  233.     TextEditComponent parent;
  234.     TextField search;
  235.     TextField replace;
  236.     Button next, all, close;
  237.     boolean replacemode;
  238.  
  239.     SARrequestor(TextEditComponent p, boolean r)
  240.     {
  241.     parent = p;
  242.     replacemode = r;
  243.     setLayout(new BorderLayout());
  244.  
  245.     // create search and replace text fields
  246.     Panel wordpanel = new SpacedPanel();
  247.     wordpanel.setLayout(new BorderLayout());
  248.     Panel left = new Panel();
  249.     left.setLayout(new GridLayout(0,1));
  250.     left.add(new Label("Search"));
  251.     if (r) left.add(new Label("Replace"));
  252.     wordpanel.add("West",left);
  253.     Panel right = new Panel();
  254.     right.setLayout(new GridLayout(0,1));
  255.     right.add(search = new TextField());
  256.     if (r) right.add(replace = new TextField());
  257.     wordpanel.add("Center",right);
  258.     add("North",wordpanel);
  259.  
  260.     // create buttons
  261.     Panel bot = new Panel();
  262.     bot.setLayout(new BorderLayout());
  263.     Panel buttonpanel = new SpacedPanel();
  264.     buttonpanel.setLayout(new GridLayout(1,0));
  265.     buttonpanel.add(next = new Button("Next"));
  266.     if (r) buttonpanel.add(all = new Button("All"));
  267.     buttonpanel.add(close = new Button("Close"));
  268.     bot.add("East",buttonpanel);
  269.     add("South",bot);
  270.  
  271.     setTitle(replacemode ? "Search and replace" : "Search");
  272.     pack();
  273.     show();
  274.     }
  275.  
  276.     public boolean handleEvent(Event evt)
  277.     {
  278.     if (evt.id == Event.WINDOW_DESTROY)
  279.         dispose();
  280.     return super.handleEvent(evt);
  281.     }
  282.  
  283.     public boolean action(Event evt, Object obj)
  284.     {
  285.     if (evt.target == close)
  286.         dispose();
  287.     else if (evt.target == next)
  288.         searchreplace();
  289.     else if (evt.target == all) {
  290.         parent.editor.select(0,0);
  291.         while(searchreplace())
  292.             ;
  293.         }
  294.     return true;
  295.     }
  296.  
  297.     // find (and maybe replace) the next occurance of a string after the
  298.     // current cursor position
  299.     boolean searchreplace()
  300.     {
  301.     String et = parent.editor.getText();
  302.     int pos = parent.editor.getSelectionEnd();
  303.     int idx = et.indexOf(search.getText(), pos);
  304.     if (idx < 0)
  305.         return false;    // not found!
  306.     if (replacemode) {
  307.         // replace word, and select new one
  308.         parent.editor.replaceText(replace.getText(), idx,
  309.                       idx+search.getText().length());
  310.         parent.editor.requestFocus();
  311.         parent.editor.select(idx, idx+replace.getText().length());
  312.         }
  313.     else {
  314.         // just select word
  315.         parent.editor.requestFocus();
  316.         parent.editor.select(idx, idx+search.getText().length());
  317.         }
  318.     return true;
  319.     }
  320.  
  321.     public Dimension minimumSize()
  322.     {
  323.     return new Dimension(250, replacemode ? 140 : 110);
  324.     }
  325.  
  326.     public Dimension preferredSize()
  327.     {
  328.     return minimumSize();
  329.     }
  330. }
  331.  
  332.